package tutorial.main.control;

import java.util.ArrayList;

import tutorial.entidades.Evento;
import tutorial.main.control.HTTPProxy.ExcepcionHTTPProxy;
import tutorial.main.data.GestorBDLista;
import tutorial.main.data.ProviderRegistro;
import tutorial.main.vista.GrillaDeEstados;
import android.content.Context;
import android.util.Log;

public class Sync {
	
	HTTPProxy proxy = new HTTPProxy();
	int sid = 0;
	
	public Sync()
	{
		
	}
	
	@Deprecated
	public boolean IniciarSesion()
	{
		int sid;
		try 
		{
			
			sid = proxy.IniciarSesion();
			this.sid = sid;
			Log.v("Sync","clave:"+sid);
			return true;
			
		} catch (ExcepcionHTTPProxy e) {
			// TODO Auto-generated catch block
			return false;
		}
	}
	
	public void syncEventos(int uid, GrillaDeEstados context)
	{
		try
		{
			Log.i("Sync Control","++ Inicio del Proceso de Syncronizacion");

			// Si la sesion no esta abierta, la abro
			if(!proxy.isSessionStarted())
			{
				proxy.IniciarSesion();
			}
			
			// Como ya esta abierta puedo comenzar con la sinc.
			if(proxy.isSessionStarted())
			{
				boolean algoCambio = false;
				ArrayList<Evento> lista = GestorBDLista.cargaEventosPrevios(ProviderRegistro.CONTENT_URI,context,uid);
				
				for (int i = 0; i < lista.size(); i++) 
				{
						Evento e = lista.get(i);
						if(e.getSincronizado())
								continue;
				
						Log.i("Sync Control","++ Tengo un evento no syncronizado i:"+i+"/"+lista.size());
								
						// No esta sync, lo envio
					 
						Log.i("Sync Control","++ Enviando los datos al Server del Evento:"+e.getId());
						
						if(proxy.EnviarDatos(e.getId(),e.getMomento(),e.getEstadoConetado(),e.getTipoConexion()))
						{
								Log.i("Sync Control","++ Se syncronizo correctamente el Evento:"+e.getId());
						
								// Se sincronizo correctamente !
								e.setSincronizado(true);
								algoCambio = true;
						}
						else
						{
								Log.i("Sync Control","-- Se produjo un error al syncronizar el Evento:"+e.getId());
						}
				}
				
				// Si hay algun cambio, lo guardo en la BD
				if(algoCambio)
				{
						Log.i("Sync Control","++ Se produjo un cambio en los eventos, actualizo la DB");
						actualizarBaseDeDatos(lista,context);
				}
				
				// Cierro la sesion
				proxy.CerrarSesion();
			}
			else
			{
				context.showDialogErrorAlIniciarSesion();
				return;
			}
		}
		catch(Exception e)
		{
				context.showDialogErrorSync();
				return;
		}
		
		context.showDialogExitoSync();	
	}


	private void actualizarBaseDeDatos(ArrayList<Evento> lista, Context cntx) 
	{
		for (int i = 0; i < lista.size(); i++) 
		{
			Evento e = lista.get(i);
			
			if(e.getId()!=0)
			{
				// Actualizo el Evento
				Log.i("Sync Control","++ Actualizo el Evento:"+e.getId());
				GestorBDLista.updateEvento(e,cntx);
			}
			else
			{
				// Guardo por primera vez
				Log.i("Sync Control","++ Inserto el Evento:"+e.getId());
				GestorBDLista.insertEvento(e,cntx);
			}
			
		}
	}

}
